#include "hal.h"
#include "terminal.h"
#include "timers.h"
#include "cilindrica.h"
#include "lpc17xx_uart.h"

union_terminal gTerminal;

/**********************************************************************************
 * Descrição:Inicializa a funcção de terminal, a qual tem a funcionalidade de
 * receber paramentros via serial que corresponderam aos botoes de um terminal.
 *
 * Paramêtro(s):
 *					-
 * Retorno:
 *					-
 **********************************************************************************/
void terminal_init(void){
        GPIO_SetDir(1,(uint32_t)(1<<31),1); 
        GPIO_ClearValue(1,(uint32_t)(1<<31));
	gTerminal.u16=0; //inicializa com zero todos os botoes do terminal
        gTerminal.input.velocidade1=1;
        gTerminal.input.pressao1=1;
        gTerminal.input.tempo1=1;
	uart2_init();	 //Inicializa a a uart em 57600/8bits/
}

/**********************************************************************************
 * Descrição:Realiza leitura do dado de entrada do terminal de forma realizar
 * interpretação de  byte a byte dos dados recebido via interface selecionada.
 *
 * Paramêtro(s):
 *					-	input - Informação a ser interpretada
 * Retorno:
 *					-
 **********************************************************************************/
  void terminal_read(uint32_t input){
    
  union{
    uint32_t u32;
    uint8_t  u8[4];
  }Resp;
          gTerminal.u16= input;

//	switch (input) {
//		case LIGADO:
//			gTerminal.input.ligado=!gTerminal.input.ligado;
//			break;
//		case DESLIGADO:
//			gTerminal.input.ligado=0;
//			break;
//		case VELOC_1:
//			gTerminal.input.velocidade1=1;
//			gTerminal.input.velocidade2=0;
//			gTerminal.input.velocidade3=0;
//			gVelocidadeInversor = VELOCIDADE1;
//			break;
//		case VELOC_2:
//			gTerminal.input.velocidade1=0;
//			gTerminal.input.velocidade2=1;
//			gTerminal.input.velocidade3=0;
//			gVelocidadeInversor = VELOCIDADE2;
//			break;
//		case VELOC_3:
//			gTerminal.input.velocidade1=0;
//			gTerminal.input.velocidade2=0;
//			gTerminal.input.velocidade3=1;
//			gVelocidadeInversor = VELOCIDADE3;
//			break;
//		case TEMPO_1:
//			gTerminal.input.tempo1=1;
//			gTerminal.input.tempo2=0;
//			gTerminal.input.tempo3=0;
//                        gControleCilindrica.TempoOperacao = 0;
//                        gControleCilindrica.TempoSelecionado = VALORTEMPO1;
//			break;
//		case TEMPO_2:
//			gTerminal.input.tempo1=0;
//			gTerminal.input.tempo2=1;
//			gTerminal.input.tempo3=0;
//                        gControleCilindrica.TempoOperacao = 0;
//                        gControleCilindrica.TempoSelecionado = VALORTEMPO2;
//			break;
//		case TEMPO_3:
//			gTerminal.input.tempo1=0;
//			gTerminal.input.tempo2=0;
//			gTerminal.input.tempo3=1;
//                        gControleCilindrica.TempoOperacao = 0;
//                        gControleCilindrica.TempoSelecionado = VALORTEMPO3;
//			break;
//		case PRESSAO_1:
//			gTerminal.input.pressao1=1;
//			gTerminal.input.pressao2=0;
//			gTerminal.input.pressao3=0;
//
//			break;
//		case PRESSAO_2:
//			gTerminal.input.pressao1=0;
//			gTerminal.input.pressao2=1;
//			gTerminal.input.pressao3=0;
//			break;
//		case PRESSAO_3:
//			gTerminal.input.pressao1=0;
//			gTerminal.input.pressao2=0;
//			gTerminal.input.pressao3=1;
//			break;
//		default://mensagem de nack??
//                break;
//	}
        Resp.u8[0]=0x7E;   
        Resp.u8[1]=0;//(gTerminal.input.ligado<<7)|(gTerminal.input.tecla_agua<<6)|(gTerminal.input.pressao3<<5)|(gTerminal.input.pressao2<<4)|(gTerminal.input.pressao1<<3)|(gTerminal.input.tempo3<<2)|(gTerminal.input.tempo2<<1)|(gTerminal.input.tempo1);		
        Resp.u8[2]=0;//(gTerminal.input.velocidade3<<2)|(gTerminal.input.velocidade2<<1)|(gTerminal.input.velocidade3);
        Resp.u8[3]=0;
        delay_ms(20);
        GPIO_SetValue(1,(uint32_t)(1<<31) );  
        terminal_feedback(Resp.u8[0]);
        delay_ms(1);
        terminal_feedback(Resp.u8[1]);
        delay_ms(1);
        terminal_feedback(Resp.u8[2]);
        delay_ms(1);
        GPIO_ClearValue(1,(uint32_t)(1<<31) );
}

/**********************************************************************************
 * Descrição:
 *
 * Paramêtro(s):
 *					-
 * Retorno:
 *					-
 **********************************************************************************/
void terminal_feedback(uint32_t output){

        //delay_ms(20);
        //GPIO_SetValue(1,(uint32_t)(1<<31) );
	//UART2Send((LPC_UART_TypeDef *)LPC_UART2,(uint8_t*)&output,1);
        UART_Send((LPC_UART_TypeDef *)LPC_UART2, (uint8_t*)&output, 1,NONE_BLOCKING);
        //delay_ms(3);
        //GPIO_ClearValue(1,(uint32_t)(1<<31) );
}

void isr_terminal(void){
  static uint8_t tmp[2];  
  static uint16_t value;
  
  if(UART_Receive((LPC_UART_TypeDef *)LPC_UART2,(uint8_t*)tmp,2,BLOCKING)==2){
      value=(tmp[0]<<8)|(tmp[1]);
      terminal_read(value);
  }
  
}
